package com.daiqee.shiro.factory;

import java.util.ArrayList;

import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.daiqee.pojo.ModulePermissions;
import com.daiqee.service.impl.ModulePermissionsService;

/**
 * 包装原有的shiro权限过滤器<br/>
 * 实现动态权限更新<br/>
 * 
 * @since JDK 1.8
 * @version  V2.1
 * @author RichardTang 
 * @date: 2018年5月30日
 * @package com.daiqee.shiro.factory
 * @copyright:Copyright (c) 2018, 1245811923@qq.com All Rights Reserved.
 */
public class WrapperShiroFilterFactoryBean extends ShiroFilterFactoryBean{

	@Autowired(required = false)
	private ModulePermissionsService modulePermissionsService;
	
	/**
	 * 可以配置加载数据库的备注,省去了配置xml;初始化的时候会加载
	 */
	@Override
	public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {
		
		//模块权限,必须使用LinkedHashMap-shiro是按照顺序来校验的
		LinkedHashMap<String,String> filterMap = new LinkedHashMap<String,String>();
		
		//查询到模块信息数据
		ArrayList<ModulePermissions> moduleInfo = (ArrayList<ModulePermissions>) modulePermissionsService.selectList(
		    //这里必须要加排序,因为Shiro的权限校验,是按顺序校验下来的
			new EntityWrapper<ModulePermissions>().orderBy("moduleId", true)
		);
		
		for (ModulePermissions modulePermissions : moduleInfo) {
		
			String permsStr = modulePermissions.getModulePerms() == null ? "" : modulePermissions.getModulePerms();
			
			//获取是否需要认证操作
			String moduleAuthentication = modulePermissions.getModuleAuthentication();
			
			//如果是anon不需要认证的情况下,不能加perms或者roles,如果添加了会报错
			if(!(moduleAuthentication.equals("anon"))) {
				 //拼接shiro权限表达式
				moduleAuthentication += ",arbitrarilyPermsFilter[" + permsStr + "]";
			}
			
			//添加shiro权限
			filterMap.put(modulePermissions.getModulePath(),moduleAuthentication);
		}
		super.setFilterChainDefinitionMap(filterMap);
	}
}
